From: Jan Beulich Date: Fri, 28 Feb 2020 15:25:43 +0000 (+0100) Subject: AMD/IOMMU: correct handling when XT's prereq features are unavailable X-Git-Tag: archive/raspbian/4.14.0+80-gd101b417b7-1+rpi1^2~63^2~597 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https://%22%22/%22http:/www.example.com/cgi/%22https:/%22%22?a=commitdiff_plain;h=9649cef3b3a7eaca1347154ea7f274586d48bc29;p=xen.git AMD/IOMMU: correct handling when XT's prereq features are unavailable We should neither cause IOMMU initialization as a whole to fail in this case (we should still be able to bring up the system in non-x2APIC or x2APIC physical mode), nor should the remainder of the function be skipped (as the main part of it won't get entered a 2nd time) in such an event. It is merely necessary for the function to indicate to the caller (iov_supports_xt()) that setup failed as far as x2APIC is concerned. Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper Reviewed-by: Roger Pau Monné --- diff --git a/xen/drivers/passthrough/amd/iommu_init.c b/xen/drivers/passthrough/amd/iommu_init.c index d9a4b0f802..147ce8ca87 100644 --- a/xen/drivers/passthrough/amd/iommu_init.c +++ b/xen/drivers/passthrough/amd/iommu_init.c @@ -1364,6 +1364,7 @@ static int __init amd_iommu_prepare_one(struct amd_iommu *iommu) int __init amd_iommu_prepare(bool xt) { struct amd_iommu *iommu; + bool has_xt = true; int rc = -ENODEV; BUG_ON( !iommu_found() ); @@ -1400,17 +1401,16 @@ int __init amd_iommu_prepare(bool xt) if ( rc ) goto error_out; - rc = -ENODEV; - if ( xt && (!iommu->features.flds.ga_sup || !iommu->features.flds.xt_sup) ) - goto error_out; + if ( !iommu->features.flds.ga_sup || !iommu->features.flds.xt_sup ) + has_xt = false; } for_each_amd_iommu ( iommu ) { /* NB: There's no need to actually write these out right here. */ - iommu->ctrl.ga_en |= xt; - iommu->ctrl.xt_en = xt; - iommu->ctrl.int_cap_xt_en = xt; + iommu->ctrl.ga_en |= xt && has_xt; + iommu->ctrl.xt_en = xt && has_xt; + iommu->ctrl.int_cap_xt_en = xt && has_xt; } rc = amd_iommu_update_ivrs_mapping_acpi(); @@ -1422,7 +1422,7 @@ int __init amd_iommu_prepare(bool xt) ivhd_type = 0; } - return rc; + return rc ?: xt && !has_xt ? -ENODEV : 0; } int __init amd_iommu_init(bool xt)